package DAO;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

import ConexaoBackupBD.ConexaoBD;
import ConexaoBackupBD.MetodosVerificacaoBD;
import BD.ProfessorBD;

public class ProfessorDAO {
    
    //Conexao com o banco de dados
    ConexaoBD conBD = new ConexaoBD();       
    
    //Metodos unique, auto incremento
    MetodosVerificacaoBD metBD = new MetodosVerificacaoBD();
    
    Statement BDProfessor;
    ResultSet rs;
    
    public int autoIncremento(){
        return metBD.autoIncremento("professor", "cod_prof");
    }
    
    public boolean inserirProfessor(ProfessorBD pro){        
        try
        {
            Connection con = conBD.conectar();
                       
            if(metBD.unique("professor", "cpf_prof", pro.getCpf()) ){ // CPF não Duplicado
                BDProfessor = con.createStatement();
                BDProfessor.execute("INSERT INTO professor VALUES "
                        + " ('"+pro.getCodigo()+"', '" + pro.getNome() + "', "
                        + " '" + pro.getCpf() + "', '" + pro.getEmail() + "');");
                
                JOptionPane.showMessageDialog(null,"Cadastro realizado com sucesso.",
                        "Cadastro", JOptionPane.INFORMATION_MESSAGE);

                con.close();
                return true;
            }
            else{
                JOptionPane.showMessageDialog(null,"CPF já existe.", "CPF duplicado",
                        JOptionPane.ERROR_MESSAGE);
                con.close();
                return false;
            }            
        }
        catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco.",
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
        }     
        
        return false;
    }
    
    public List<ProfessorBD> filtro(String campo, String valor) {      
        List<ProfessorBD> listaFiltro = new ArrayList<ProfessorBD>(); 
        try { 
            Connection con = conBD.conectar();
            BDProfessor = con.createStatement();
            rs = BDProfessor.executeQuery("SELECT * from professor "
                    + " where "+campo+" like '" + valor + "%'");
           
            if (rs != null) { 
                while (rs.next()) { 
                    ProfessorBD pf = new ProfessorBD();
                    pf.setCodigo(rs.getInt("cod_prof"));
                    pf.setNome(rs.getString("nome_prof"));
                    pf.setCpf(rs.getString("cpf_prof"));
                    pf.setEmail(rs.getString("email_prof")); 
                    listaFiltro.add(pf); 
                }
                con.close();
                return listaFiltro; 
          }else {
                con.close();
                return null; 
          } 
        } catch (SQLException e) { 
            return null; 
        } 
    }
    
    public boolean alterarProfessor(ProfessorBD pf){
        String sql = "update professor set nome_prof = ?,cpf_prof = ?, email_prof = ?";
        sql += " where cod_prof = ?";

        try {
            // obtem conexão
            Connection con = conBD.conectar();
            BDProfessor = con.createStatement();

            //Obtem o CPF do Professor que foi ENVIADO para alteração
            rs = BDProfessor.executeQuery("SELECT cpf_prof from professor "
                    + " where cod_prof = '"+pf.getCodigo()+"'");
            rs.first();
            String capturaCpf= rs.getString("cpf_prof");


            if(metBD.unique("professor", "cpf_prof", pf.getCpf()) || capturaCpf.equals(pf.getCpf())) // Deixa Cadastrar
            {
                PreparedStatement ps = con.prepareStatement(sql);

                ps.setString(1, pf.getNome());
                ps.setString(2, pf.getCpf());
                ps.setString(3, pf.getEmail());
                ps.setString(4, (String.valueOf(pf.getCodigo())));
                if (ps.executeUpdate() > 0) {
                    JOptionPane.showMessageDialog(null,"Alteração realizada com sucesso.",
                            "Alterar", JOptionPane.INFORMATION_MESSAGE);
                    con.close();
                return true;
                } else {
                    JOptionPane.showMessageDialog(null,"Não foi possível realizar a alteração.",
                            "Erro em alterar", JOptionPane.ERROR_MESSAGE);
                    con.close();
                return false;
                }     
            }
            else{
                JOptionPane.showMessageDialog(null,"CPF já existe.", 
                        "CPF duplicado", JOptionPane.INFORMATION_MESSAGE);
                return false;
            }
      }catch (SQLException e) {
            JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco.",
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
            return false;
      }
    }
    
    public boolean excluirProfessor(ProfessorBD pr){
        String sql = "delete from professor where cod_prof = ?";   
              
        try {
            Connection con = conBD.conectar();
                                      
            //Verifica se Professor que foi ENVIADO é FK de Aluno
            BDProfessor = con.createStatement();
            rs = BDProfessor.executeQuery("SELECT count(cod_prof) from aluno "
                    + "where cod_prof = '"+pr.getCodigo()+"' ");
            rs.last();
            int capturaOrientador= rs.getInt(1);
      
            //Verifica se Professor que foi ENVIADO é FK de Disciplina
            BDProfessor = con.createStatement();
            rs = BDProfessor.executeQuery("SELECT count(cod_prof) from turmadisciplina "
                    + "where cod_prof = '"+pr.getCodigo()+"' ");
            rs.last();
            int capturaDisciplina= rs.getInt(1);

            
            if(capturaOrientador >= 1 || capturaDisciplina >=1){ //Possui FK's?
                if(capturaOrientador >= 1 && capturaDisciplina >= 1){ //Duas FK's?
                    JOptionPane.showMessageDialog(null,"Professor esta ligado a aluno e a disciplina,"
                            + " não pode ser excluído.", 
                            "Excluir", JOptionPane.INFORMATION_MESSAGE);                   
                }
                else{
                    if(capturaOrientador >= 1){ // só a aluno
                        JOptionPane.showMessageDialog(null,"Professor esta ligado a aluno,"
                                + " não pode ser excluído.", 
                            "Excluir", JOptionPane.INFORMATION_MESSAGE);
                    }
                    if(capturaDisciplina >= 1){ // só a disciplina
                        JOptionPane.showMessageDialog(null,"Professor esta ligado a disciplina,"
                                + " não pode ser excluído.", 
                            "Excluir", JOptionPane.INFORMATION_MESSAGE);  
                    }
                }
                con.close();
                return false;              
            }
            else{
                PreparedStatement ps = con.prepareStatement(sql);
                ps.setString(1, (String.valueOf(pr.getCodigo())));
                if (ps.executeUpdate() > 0) {
                    con.close();
                    return true;
                } else {
                    con.close();
                    return false;
                }               
            }
        } catch (SQLException e) {
             JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco.", 
             "Erro no banco", JOptionPane.ERROR_MESSAGE);
             return false;
        }
   } 
    
    public List<ProfessorBD> carregarComboProfessor(){
        List<ProfessorBD> listaprofessor = new ArrayList<ProfessorBD>(); //Lista para Codigo + nome
        try
        {      
            Connection con = conBD.conectar();         
            BDProfessor = con.createStatement();
            rs = BDProfessor.executeQuery("SELECT cod_prof, nome_prof, cpf_prof "
                    + " from professor ");
            ProfessorBD selecioneProfessor = new ProfessorBD();
            selecioneProfessor.setCodigo(-1);
            selecioneProfessor.setNome("-- Selecione um Professor --");
            listaprofessor.add(selecioneProfessor);
            while(rs.next()){
                ProfessorBD pf = new ProfessorBD();
                pf.setCodigo(rs.getInt("cod_prof"));
                pf.setNome(rs.getString("nome_prof"));
                pf.setCpf(rs.getString("cpf_prof"));
                listaprofessor.add(pf);
            }  
            con.close();  
            return listaprofessor;
        }
        catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), 
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
        }
        return listaprofessor;
     }  
}
